
#指定CMake的最小版本要求
cmake_minimum_required(VERSION 3.0) 

#设置当前项目名称
project(SOLIDPROJECT)

#为变量设置编译参数选项
# -g 表示输出可调试信息 -Wall 表示输出警告信息 -O2表示执行代码优化(减少代码的重复性，实现低耦合高内聚)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -O2 " )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall " ) #显式的定义变量

#添加编译参数
# add_compile_options(-Wall -std=c++11 -o2)

#设置一个编译变量，Debug表示生成可调试的文件，Release表示发布
set(CMAKE_BUILD_TYPE Debug)

# 定义SRC变量，其值为Gun.cpp Solider.cpp
set(SRC src/Gun.cpp src/Solider.cpp)

#向工程添加多个特定的头文件搜索路径 --->相当于指定g++编译器的-I参数
#include_directories(include) #相对路径
include_directories(${CMAKE_SOURCE_DIR}/include) #绝对路径

#向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数
include_directories(/usr/lib)

#向当前工程添加存放源文件的子目录，并可以指定中间二进制和目标二进制存放的位置
# 添加src子目录，src中需有一个CMakeLists.txt
#add_subdirectory(src DIR_SRCS)

#发现一个目录下所有的源代码文件并将列表存储在一个变量中，这个指令临时被用来自动构建源文件列表
# 定义SRC_变量，其值为当前目录下所有的源代码文件
# aux_source_directory(. SRC_)
# 编译SRC_变量所代表的源代码文件，生成main可执行文件
# add_executable(main ${SRC_})

#生成库文件
#通过变量SRC 生成 libgun.so共享库
add_library(gun SHARED ${SRC})

#生成可执行文件(二进制)
add_executable(main_cmake main.cpp src/Gun.cpp src/Solider.cpp) 

#为 target 添加需要链接的共享库 --->相同于指定g++编译器-l参数
# 将add_library()产生的 gun 动态库文件链接到可执行文件 main_cmake
target_link_libraries(main_cmake gun)

#[[
CMake常用变量:
    CMAKE_C_FLAGS gcc编译选项
    CMAKE_CXX_FLAGS g++编译选项
        1 # 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
        2 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

    CMAKE_BUILD_TYPE 编译类型(Debug, Release)
        1 # 设定编译类型为debug，调试时需要选择debug
        2 set(CMAKE_BUILD_TYPE Debug)
        3 # 设定编译类型为release，发布时需要选择release
        4 set(CMAKE_BUILD_TYPE Release)

    CMAKE_BINARY_DIR
    PROJECT_BINARY_DIR
    _BINARY_DIR
        1. 这三个变量指代的内容是一致的。
        2. 如果是 in source build，指的就是工程顶层目录。
        3. 如果是 out-of-source 编译,指的是工程编译发生的目录
        4. PROJECT_BINARY_DIR 跟其他指令稍有区别
    
    CMAKE_SOURCE_DIR
    PROJECT_SOURCE_DIR
    _SOURCE_DIR
        1. 这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。
        2. 也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致。
    
    CMAKE_C_COMPILER：指定C编译器
    CMAKE_CXX_COMPILER：指定C++编译器
    EXECUTABLE_OUTPUT_PATH：可执行文件输出的存放路径
    LIBRARY_OUTPUT_PATH：库文件输出的存放路径
]]